/*
 * funcionesConsolaPDD.c
 *
 *  Created on: 05/12/2011
 *      Author: utn_so
 */

#include "funcionesConsolaPDD.h"

void interpretar_msj(uint16_t socket, char* buffer){
	/*interpretar_msj es llamado desde el PDD por eso el socket que trae, es el del cliente(consola) y cuando realizo un send lo realizo a ese cliente*/
	char *nombreFuncion = (char *) malloc (10 * sizeof(char)),* sectores;
	nombreFuncion = strtok(buffer, " ");
	uint32_t parametros[5]= {-1,-1,-1,-1,-1};
	uint8_t index = 0;
	switch (nombreFuncion[0]){
	case ('i'):
		info(socket);
		break;
	case ('c'):
		parametros[0] = atoi(strtok(NULL," "));
		parametros[1] = atoi(strtok(NULL," "));
		clean(socket,parametros[0],parametros[1]);
		break;
	case ('t'):
		sectores = strtok(NULL," ");
		while(sectores != '\0') {
			parametros[index] = sectores;
			sectores = strtok(NULL," ");
			index++;
		}
		trace(socket,parametros,index);
		break;
	default:
		sprintf(buffer, "e|%s", nombreFuncion);
		if (send(socket, buffer, strlen(buffer), 0) == -1) {
			free(nombreFuncion);
			perror("send");
			exit(1);
		}
		break;
	}
	free(nombreFuncion);
}

/* Imprime en pantalla posicion actual del cabezal */
void info (uint16_t socket){
	char* buffer = (char*) malloc(4 + (3*sizeof(int)));/* Al sizeof se suman 4bytes porque son los separadores y el codigo de instruccion */
	t_chs * posActual = getCHSActual();
	sprintf(buffer,"i|%d|%d|%d",posActual->cilindro, posActual->cabeza,posActual->sector);
	if (send(socket, buffer, strlen(buffer), 0) == -1) {
		free(buffer);/* Libero aca porque si salta un error dejo la memoria limpia para seguir procesando */
		perror("send");
		exit(1);
	}

	free(buffer);
}

/* Limpia los sectores */
void clean(uint16_t socket, uint32_t sectorIni, uint32_t sectorFin){
	char* buffer = (char*) malloc(2 * sizeof(char)); /* Se multiplica x2 porque ademas del caracter de la funcion esta el caracter delimitador */
	t_peticion *peticion;
	uint32_t index;

	peticion->tOperacion = ESCRITURA;
	peticion->length = 512; //Esto es porque cada sector es de 512B
	peticion->nSector = index;
	memset(peticion->info,'\0',512);
	for (index = sectorIni ; index <= sectorFin ; index++){
		agregarPeticionACola(peticion);
	}
	sprintf(buffer,"c|");
	if (send(socket, buffer, strlen(buffer), 0) == -1) {
		free(buffer);/* Libero aca porque si salta un error dejo la memoria limpia para seguir procesando */
		perror("send");
		exit(1);
	}

	free(buffer);

}

void trace(uint16_t socket, uint32_t *parametros,uint8_t index ){
	t_peticion *peticion;
	peticion->tOperacion = CONSOLAPDD;
	int i;
	for(i = 0; i == index; i++) {
		peticion->nSector = parametros[i];
		agregarPeticionACola(peticion);
	}
}
